﻿using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MyBlog.IService;
using MyBlog.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MyBlog.WebApi.Controllers.DIDemo
{
    /*
     * 演示依赖注入生命周期的例子
     */
    [Route("api/[controller]")]
    [ApiController]
    public class DIDemoController : ControllerBase
    {
        private readonly IBlogNewsService _blogNewsService;
        public DIDemoController(IBlogNewsService blogNewsService)
        {
            _blogNewsService = blogNewsService;
        }


        /// <summary>
        /// 实例对象在一个方法中多次调用的情况
        /// </summary>
        /// <returns></returns>
        [HttpGet("GetBlogNews2")]
        public async Task<IActionResult> GetBlogNews2()
        {
            var data = await _blogNewsService.QueryAsync();

            //执行第二遍
            var data2 = await _blogNewsService.QueryAsync();

            //测试结论：无论是哪种注入方式，在同一个http请求中，_blogNewsService都是同一个对象，因为这就是同一个对象_blogNewsService啊，哈哈
            //只有AddSingleton注入时，_blogNewsService只会实例在系统中实例化一次，其他之后的http请求都不会实例了，因为是单例
            //AddTransient注入时和AddScoped注入时，每次http请求都会重新实例化 _blogNewsService！！！！
            return new JsonResult(new
            {
                first = "第一个实例:" + _blogNewsService.GetHashCode(),
                seconed = "第二个实例:" + _blogNewsService.GetHashCode(),
            });
        }


        /// <summary>
        /// 在同一个方法中获取多次实例对象的情况
        /// </summary>
        /// <returns></returns>
        [HttpGet("GetBlogNews3")]
        public async Task<IActionResult> GetBlogNews3()
        {
            //实例_blogNewsService
            var data = await _blogNewsService.QueryAsync();


            //重新获取一个实例new_blogNewsService
            IBlogNewsService new_blogNewsService = HttpContext.RequestServices.GetService(typeof(IBlogNewsService)) as IBlogNewsService;
            var data2 = await new_blogNewsService.QueryAsync();

            //测试结论：AddTransient注入时，同一个http请求时，_blogNewsService和new_blogNewsService不是同一个对象。不同http请求时，_blogNewsService和new_blogNewsService不是同一个对象。
            //AddScoped注入时，同一个http请求时，_blogNewsService和new_blogNewsService是同一个对象。不同的http请求，_blogNewsService和new_blogNewsService也是同一个对象，只不过跟另一个http请求不是一个实例
            //AddSingleton注入时，_blogNewsService和new_blogNewsService是同一个对象，无论他是哪个http接口，整个系统中就这一个实例。
            return new JsonResult(new
            {
                first = "第一个实例:" + _blogNewsService.GetHashCode(),
                seconed = "第二个实例:" + new_blogNewsService.GetHashCode(),
            });
        }
    }
}
